#include "start_freertos.h"
#include "stdio.h"

TaskHandle_t startHandle;  // 启动任务句柄

/**
 * @brief 系统启动任务
 * 
 * 此任务作为系统初始化入口，完成以下关键操作：
 * 1. 进入临界区保护初始化过程
 * 2. 初始化硬件外设（传感器/执行器）
 * 3. 创建核心功能任务（心跳/采集/执行）
 * 4. 删除自身释放资源
 * 
 * @param param 任务参数（未使用）
 */
void start_task(void *param) {
    // 进入临界区（禁用中断）确保初始化过程不被中断
    taskENTER_CRITICAL();

    // === 硬件初始化阶段 ===
    init_heart();    // 初始化心跳组件（如状态指示灯）
    init_gather();   // 初始化传感器（温湿度/光照/烟雾等）
    init_execute();  // 初始化执行器（空调/窗帘/报警器等）
    init_bluetooth(); 

    // === 任务创建阶段 ===
    createHeartTask();   // 创建心跳任务（周期性闪烁LED指示系统运行）
    createGatherTask();  // 创建数据采集任务（读取传感器数据）
    createExecuteTask(); // 创建执行任务（根据数据控制设备）
    createBluetoothTask(); // 创建蓝牙任务（用于连接外设）

    // === 资源清理 ===
    vTaskDelete(NULL);  // 删除当前任务（自身），释放内存和CPU资源
    
    // 注意：此处的退出临界区不会被执行，因任务已删除
    taskEXIT_CRITICAL();
}

/**
 * @brief 启动FreeRTOS调度系统
 * 
 * 系统初始化入口函数：
 * 1. 创建启动任务（优先级2，128字栈空间）
 * 2. 启动FreeRTOS任务调度器
 * 3. 永不返回（调度器接管系统控制权）
 */
void freertos_start() {
    // 创建启动任务（系统初始化任务）
    BaseType_t res = xTaskCreate(
        start_task,         // 任务函数
        "start_task",       // 任务名称
        128,                // 栈大小
        NULL,               // 任务参数
        2,                  // 优先级（高于普通任务）
        &startHandle        // 任务句柄
    );
    
    // 任务创建状态检查
    if (res == pdPASS) {
        printf("create start_task success\r\n");
    }
    
    // 启动FreeRTOS任务调度器（永不返回）
    vTaskStartScheduler();
    
    // 注意：调度器启动后程序不会执行到此处
}